home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / dev / misc / AmigaSDLsrc.lha / amisrc / SDL_getenv.c < prev    next >
C/C++ Source or Header  |  2001-04-29  |  3KB  |  172 lines

  1.  
  2. /* Not all environments have a working getenv()/putenv() */
  3.  
  4. #ifdef TEST_MAIN
  5. #define NEED_SDL_GETENV
  6. #endif
  7.  
  8. #include "SDL_getenv.h"
  9.  
  10. #ifdef NEED_SDL_GETENV
  11.  
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. static char **SDL_env = (char **)0;
  16.  
  17. /* Put a variable of the form "name=value" into the environment */
  18. int SDL_putenv(const char *variable)
  19. {
  20.     const char *name, *value;
  21.     int added;
  22.     int len, i;
  23.     char **new_env;
  24.     char *new_variable;
  25.  
  26.     /* A little error checking */
  27.     if ( ! variable ) {
  28.         return(-1);
  29.     }
  30.     name = variable;
  31.     for ( value=variable; *value && (*value != '='); ++value ) {
  32.         /* Keep looking for '=' */ ;
  33.     }
  34.     if ( *value ) {
  35.         ++value;
  36.     } else {
  37.         return(-1);
  38.     }
  39.  
  40.     /* Allocate memory for the variable */
  41.     new_variable = (char *)malloc(strlen(variable)+1);
  42.     if ( ! new_variable ) {
  43.         return(-1);
  44.     }
  45.     strcpy(new_variable, variable);
  46.  
  47.     /* Actually put it into the environment */
  48.     added = 0;
  49.     i = 0;
  50.     if ( SDL_env ) {
  51.         /* Check to see if it's already there... */
  52.         len = (value - name);
  53.         for ( ; SDL_env[i]; ++i ) {
  54.             if ( strncmp(SDL_env[i], name, len) == 0 ) {
  55.                 break;
  56.             }
  57.         }
  58.         /* If we found it, just replace the entry */
  59.         if ( SDL_env[i] ) {
  60.             free(SDL_env[i]);
  61.             SDL_env[i] = new_variable;
  62.             added = 1;
  63.         }
  64.     }
  65.  
  66.     /* Didn't find it in the environment, expand and add */
  67.     if ( ! added ) {
  68.         new_env = realloc(SDL_env, (i+2)*sizeof(char *));
  69.         if ( new_env ) {
  70.             SDL_env = new_env;
  71.             SDL_env[i++] = new_variable;
  72.             SDL_env[i++] = (char *)0;
  73.             added = 1;
  74.         } else {
  75.             free(new_variable);
  76.         }
  77.     }
  78.     return (added ? 0 : -1);
  79. }
  80.  
  81. /* Retrieve a variable named "name" from the environment */
  82. char *SDL_getenv(const char *name)
  83. {
  84.     int len, i;
  85.     char *value;
  86.  
  87.     value = (char *)0;
  88.     if ( SDL_env ) {
  89.         len = strlen(name);
  90.         for ( i=0; SDL_env[i] && !value; ++i ) {
  91.             if ( (strncmp(SDL_env[i], name, len) == 0) &&
  92.                  (SDL_env[i][len] == '=') ) {
  93.                 value = &SDL_env[i][len+1];
  94.             }
  95.         }
  96.     }
  97.     return value;
  98. }
  99.  
  100. #endif /* NEED_GETENV */
  101.  
  102. #ifdef TEST_MAIN
  103. #include <stdio.h>
  104.  
  105. int main(int argc, char *argv[])
  106. {
  107.     char *value;
  108.  
  109.     printf("Checking for non-existent variable... ");
  110.     fflush(stdout);
  111.     if ( ! getenv("EXISTS") ) {
  112.         printf("okay\n");
  113.     } else {
  114.         printf("failed\n");
  115.     }
  116.     printf("Setting FIRST=VALUE1 in the environment... ");
  117.     fflush(stdout);
  118.     if ( putenv("FIRST=VALUE1") == 0 ) {
  119.         printf("okay\n");
  120.     } else {
  121.         printf("failed\n");
  122.     }
  123.     printf("Getting FIRST from the environment... ");
  124.     fflush(stdout);
  125.     value = getenv("FIRST");
  126.     if ( value && (strcmp(value, "VALUE1") == 0) ) {
  127.         printf("okay\n");
  128.     } else {
  129.         printf("failed\n");
  130.     }
  131.     printf("Setting SECOND=VALUE2 in the environment... ");
  132.     fflush(stdout);
  133.     if ( putenv("SECOND=VALUE2") == 0 ) {
  134.         printf("okay\n");
  135.     } else {
  136.         printf("failed\n");
  137.     }
  138.     printf("Getting SECOND from the environment... ");
  139.     fflush(stdout);
  140.     value = getenv("SECOND");
  141.     if ( value && (strcmp(value, "VALUE2") == 0) ) {
  142.         printf("okay\n");
  143.     } else {
  144.         printf("failed\n");
  145.     }
  146.     printf("Setting FIRST=NOVALUE in the environment... ");
  147.     fflush(stdout);
  148.     if ( putenv("FIRST=NOVALUE") == 0 ) {
  149.         printf("okay\n");
  150.     } else {
  151.         printf("failed\n");
  152.     }
  153.     printf("Getting FIRST from the environment... ");
  154.     fflush(stdout);
  155.     value = getenv("FIRST");
  156.     if ( value && (strcmp(value, "NOVALUE") == 0) ) {
  157.         printf("okay\n");
  158.     } else {
  159.         printf("failed\n");
  160.     }
  161.     printf("Checking for non-existent variable... ");
  162.     fflush(stdout);
  163.     if ( ! getenv("EXISTS") ) {
  164.         printf("okay\n");
  165.     } else {
  166.         printf("failed\n");
  167.     }
  168.     return(0);
  169. }
  170. #endif /* TEST_MAIN */
  171.  
  172.